package Volatile_1;

/**
 * 测试可见变量：
 * volatile特性：多线程可见，其被修改后会立刻刷到内存，而其他线程从内存读取
 * 特点：多线程读不会产生竞态，多线程写会，其用法类似于读锁，读共享，写竞争（注意因为其被修改会立刻刷新到内存这一特性，其存在一写多读的情况，也不会产生竞态）
 */
public class TestVolatile {

    private volatile boolean flag = true;
    int i = 0;

    public void write() {
        while (flag) {
            i++;

            if(i >= 10) {
                flag = false;
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    public void read() {
        while (flag) {
            System.out.println(i + "：" + "未到读的时候！");
        }
        System.out.println(i + "：" + "读取！");
    }


    public static void main(String[] args) {

        TestVolatile testVolatile = new TestVolatile();

        new Thread(testVolatile::write).start();
        new Thread(testVolatile::read).start();
    }
}
